package com.briup.day16;

import java.util.Random;
import java.util.TreeSet;

public class TreeSetTest {
    public static void main(String[] args) {
        /*
            TreeSet：底层使用的TreeMap集合，使用的数据结构是树，
            我们可以指定将存放到集合中时的排序逻辑，
            排序的逻辑的指定可以通过 自然排序和选择排序
            Comparator:
                自定义排序，是一个函数式接口，内部存在抽象方法：
                    int compare(Object o,Object o2);
                对于JDK中的已经实现过的类，如果想重新编写排序逻辑，
                那么建议使用本接口进行实现
            Comparable:
               自然排序，通常是定义在类中，直接使某一个类实现该接口，
               从写接口中的compareTo()方法，如Integer类默认实现了
               Comparable接口；实现逻辑是从小到大进行排序；如果是自定义类型
               或使用默认的排序方案，我们可以直接在定义类时，实现本接口，编写排序比较的逻辑，
               如果是JDK中存在的类，但是没有实现本接口进行排序时，那么就无法使用本接口

               在自然排序中，默认就是从小到大进行排序，两个值（a和b）进行比较，
               如果返回值为负数，那么说明a比b小（a-b<0），如果返回值为0，表示
               两个值相等，如果返回值为正数表示a比b更大（a-b>0）；
               在集合排序上的体现为：如果返回值为负数，那么a会放在b的左边，如果返回值为
               0，那么后面添加的元素将不会放入到集合中，如果返回值为正数，那么a会放在b的右边

               在TreeSet中，如果定义了自定义排序，那么自定义排序的规则优先于自然排序，在源码中定义的
         */
        // 将整型数据存储到集合中，要求存入的数据不能重复，
        // 同时在读取时结果必须时奇数在前，奇数部分正序排序，偶数在后，偶数部分倒序排序
        Random random = new Random();

        // 在创建TreeSet集合时，可以通过构造器，指定集合中存储元素的排序规则
        // 在Comparator接口中的compare(E e,E e2)中，第一个参数e是待添加的元素，e2是已经存在的元素
        TreeSet<Integer> integers = new TreeSet<>((o1, o2) -> {
            if (o1 % 2 == 0) {
                // 返回值为1 表示的是 o1-o2 恒大于0，即o1恒在o2的右边
                // 如果o1和o2都是偶数，要实现结果倒序，那么需要返回o2-o1
                return o2 % 2 != 0 ? 1 : o2 - o1;
            } else {
                return o2 % 2 != 0 ? o1 - o2 : -1;
            }
        });
        // 在集合中存入20个元素
        // 给set集合添加元素时，注意不要指定执行添加元素语句的次数，
        // 因为执行了几次语句不代表就一定能添加进几个数据；
        // 而是因为根据集合中实际存入的元素个数进行控制
        while (integers.size() < 20) {
            // 如果添加数据时，已经存在重复的数据，那么第二次待添加的数据不会放入到集合中
            integers.add(random.nextInt(100));
        }
        System.out.println(integers.size());
        System.out.println(integers);
    }
}
